Room Persistence Library হল Android Jetpack এর একটি অংশ, যা SQLite ডাটাবেজ ব্যবহারের জন্য একটি সহজ এবং কার্যকরী ORM (Object Relational Mapping) সমাধান প্রদান করে। Room ডেভেলপারদের জন্য SQL লাইটওয়েট অপারেশন পরিচালনা করা, টাইপ-সেফ কোয়েরি চালানো, এবং ডেটা পরিবর্তনের সময় রিয়েল-টাইম আপডেট প্রদান করা সহজ করে। এটি ডেটাবেজ অপারেশনগুলিকে আরও সুসংহত এবং মেইন্টেনেবল করে তোলে।
Room Persistence Library দিয়ে Local Database ম্যানেজমেন্ট
নিচে Room Persistence Library দিয়ে Local Database ম্যানেজমেন্টের ধাপে ধাপে আলোচনা এবং উদাহরণ দেওয়া হলো:
১. Room Library যোগ করা
Gradle ফাইলে Room Library এর ডিপেনডেন্সি যোগ করুন:
implementation "androidx.room:room-runtime:2.5.0"
kapt "androidx.room:room-compiler:2.5.0"
Note: যদি আপনি Kotlin ব্যবহার করেন, তাহলে kapt ব্যবহার করতে হবে। Java এর জন্য annotationProcessor ব্যবহার করা হয়।
২. Room এর মূল উপাদানসমূহ
Room তিনটি মূল উপাদানের উপর ভিত্তি করে কাজ করে:
- Entity: ডেটা মডেল যা ডাটাবেজ টেবিলকে প্রতিনিধিত্ব করে।
- DAO (Data Access Object): SQL কোয়েরি যা ডেটাবেজে অপারেশন সম্পন্ন করে।
- Database: RoomDatabase যা DAO এবং Entity এর মধ্যে যোগাযোগ করে এবং ডাটাবেজ তৈরি করে।
৩. Entity তৈরি করা
Entity হল একটি ডেটা মডেল ক্লাস, যা একটি ডাটাবেজ টেবিলের সাথে সম্পর্কিত। Entity ক্লাসে প্রতিটি ফিল্ড একটি টেবিল কলাম হিসেবে ব্যবহৃত হয়।
উদাহরণ: Entity Class তৈরি করা
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val username: String,
val email: String
)
এখানে, User ক্লাসটি একটি Entity হিসেবে তৈরি করা হয়েছে। id ফিল্ডটি প্রাইমারি কী এবং এটি অটো-জেনারেট হবে।
৪. DAO (Data Access Object) তৈরি করা
DAO হল একটি ইন্টারফেস, যা SQL কোয়েরি এবং ডেটাবেজ অপারেশন সম্পন্ন করতে ব্যবহার করা হয়। Room DAO ইন্টারফেস ব্যবহার করে SQL কোয়েরি টাইপ-সেফ করে এবং এটি Compile-Time এ যাচাই করা হয়।
উদাহরণ: DAO তৈরি করা
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
@Dao
interface UserDao {
@Insert
suspend fun insert(user: User)
@Query("SELECT * FROM users")
fun getAllUsers(): LiveData<List<User>>
@Query("SELECT * FROM users WHERE id = :userId")
suspend fun getUserById(userId: Int): User?
@Query("DELETE FROM users WHERE id = :userId")
suspend fun deleteUser(userId: Int)
}
এখানে UserDao ইন্টারফেসে insert(), getAllUsers(), getUserById(), এবং deleteUser() মেথড যোগ করা হয়েছে। LiveData ব্যবহার করে, আপনি রিয়েল-টাইম ডেটা আপডেট পেতে পারেন।
৫. Room Database তৈরি করা
Room ডাটাবেজ তৈরি করার জন্য একটি Abstract ক্লাস তৈরি করতে হয়, যা RoomDatabase এক্সটেন্ড করে এবং DAO গুলিকে সংযুক্ত করে।
উদাহরণ: Database Class তৈরি করা
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
INSTANCE = instance
instance
}
}
}
}
এখানে, AppDatabase ক্লাসটি RoomDatabase এক্সটেন্ড করেছে এবং UserDao কে সংযুক্ত করেছে। getDatabase() মেথড সিঙ্গেলটন প্যাটার্ন ব্যবহার করে ডাটাবেজ ইন্সটেন্স রিটার্ন করে, যাতে একাধিক ইন্সটেন্স তৈরি না হয়।
৬. Room Database এর সাথে কাজ করা
Room Database ব্যবহার করে ডেটা অ্যাক্সেস করা এবং ম্যানেজ করার জন্য ViewModel এবং Coroutines ব্যবহার করা যায়।
উদাহরণ: ViewModel এ Room Database ব্যবহার করা
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class UserViewModel(private val userDao: UserDao) : ViewModel() {
val allUsers: LiveData<List<User>> = userDao.getAllUsers()
fun insertUser(user: User) {
viewModelScope.launch {
userDao.insert(user)
}
}
fun deleteUserById(userId: Int) {
viewModelScope.launch {
userDao.deleteUser(userId)
}
}
}
এখানে UserViewModel এ Room এর UserDao ব্যবহার করা হয়েছে, এবং insertUser() ও deleteUserById() মেথড Coroutines ব্যবহার করে ব্যাকগ্রাউন্ডে ডেটাবেজ অপারেশন সম্পন্ন করছে।
৭. Room Database এর সাথে UI ইন্টিগ্রেশন
Room Database এর সাথে LiveData ব্যবহার করে, আপনি UI কে রিয়েল-টাইমে আপডেট করতে পারেন। নিচে Room Database এর সাথে RecyclerView এবং LiveData ব্যবহার করে UI আপডেট করার উদাহরণ দেওয়া হলো।
উদাহরণ: Fragment এ ViewModel এবং LiveData ব্যবহার করা
class UserListFragment : Fragment() {
private lateinit var viewModel: UserViewModel
private lateinit var adapter: UserAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding: FragmentUserListBinding = DataBindingUtil.inflate(
inflater, R.layout.fragment_user_list, container, false
)
val application = requireNotNull(this.activity).application
val database = AppDatabase.getDatabase(application)
val viewModelFactory = UserViewModelFactory(database.userDao())
viewModel = ViewModelProvider(this, viewModelFactory).get(UserViewModel::class.java)
adapter = UserAdapter()
binding.recyclerView.adapter = adapter
viewModel.allUsers.observe(viewLifecycleOwner, { users ->
users?.let {
adapter.submitList(it)
}
})
return binding.root
}
}
এখানে UserListFragment এ UserViewModel ব্যবহার করা হয়েছে এবং allUsers LiveData অবজার্ভ করা হয়েছে। ডেটা পরিবর্তিত হলে UI তে রিয়েল-টাইম আপডেট হয়।
৮. Room Database এ Testing
Room Database এ টেস্টিং করার জন্য Room.inMemoryDatabaseBuilder() ব্যবহার করা যেতে পারে, যা একটি ইন-মেমোরি ডাটাবেজ তৈরি করে। এটি সাধারণত Unit Test এর জন্য ব্যবহৃত হয়।
উদাহরণ: Room Database Unit Test
@RunWith(AndroidJUnit4::class)
class UserDaoTest {
private lateinit var database: AppDatabase
private lateinit var userDao: UserDao
@Before
fun createDb() {
val context = ApplicationProvider.getApplicationContext<Context>()
database = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()
userDao = database.userDao()
}
@After
fun closeDb() {
database.close()
}
@Test
fun insertAndGetUser() = runBlocking {
val user = User(username = "John", email = "john@example.com")
userDao.insert(user)
val retrievedUser = userDao.getUserById(1)
assertEquals(retrievedUser?.username, "John")
}
}
উপসংহার
Room Persistence Library একটি শক্তিশালী এবং কার্যকর ORM ফ্রেমওয়ার্ক, যা ডাটাবেজ অপারেশনগুলিকে সহজ, টাইপ-সেফ এবং রিয়েল-টাইম আপডেট সমর্থন করে। Room ব্যবহার করে আপনি Android অ্যাপ্লিকেশনগুলিতে সহজে ডাটাবেজ পরিচালনা করতে এবং ডেটা ম্যানেজ করতে পারেন। ViewModel এবং LiveData এর সাথে Room এর সমন্বয় করে একটি কার্যকরী এবং রেসপন্সিভ ডেটাবেস ভিত্তিক অ্যাপ্লিকেশন তৈরি করা সম্ভব।
Read more